package com.dxjy.demo.module.demo;

import cn.dev33.satoken.session.SaSessionCustomUtil;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.dxjy.demo.entity.R;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * 测试专用Controller
 * @author kong
 *
 */
@RestController
@RequestMapping("/satoken/")
public class SaTokenTestController {

	// 测试登录接口， 浏览器访问： http://localhost:8081/satoken/login
	@GetMapping("login")
	public R login(@RequestParam(defaultValue="10001") String id) {
		System.out.println("======================= 进入方法，测试登录接口 ========================= ");
		System.out.println("当前会话的token：" + StpUtil.getTokenValue());
		System.out.println("当前是否登录：" + StpUtil.isLogin());
		System.out.println("当前登录账号：" + StpUtil.getLoginIdDefaultNull());

		StpUtil.login(id);			// 在当前会话登录此账号
		System.out.println("登录成功");
		System.out.println("当前是否登录：" + StpUtil.isLogin());
		System.out.println("当前登录账号：" + StpUtil.getLoginId());
//		System.out.println("当前登录账号并转为int：" + StpUtil.getLoginIdAsInt());
		System.out.println("当前登录设备：" + StpUtil.getLoginDevice());
		System.out.println("当前token信息：" + StpUtil.getTokenInfo());

		return R.ok(StpUtil.getTokenInfo());
	}

	// 测试退出登录 ， 浏览器访问： http://localhost:8081/test/logout
	@GetMapping("logout")
	public R logout() {
		StpUtil.logout();
		//StpUtil.logoutByLoginId(10001);
		return R.ok();
	}

	// 测试角色接口， 浏览器访问： http://localhost:8081/test/testRole
	@GetMapping("testRole")
	public R testRole() {
		System.out.println("======================= 进入方法，测试角色接口 ========================= ");

		System.out.println("是否具有角色标识 user " + StpUtil.hasRole("user"));
		System.out.println("是否具有角色标识 admin " + StpUtil.hasRole("admin"));

		System.out.println("没有admin权限就抛出异常");
		StpUtil.checkRole("admin");

		System.out.println("在【admin、user】中只要拥有一个就不会抛出异常");
		StpUtil.checkRoleOr("admin", "user");

		System.out.println("在【admin、user】中必须全部拥有才不会抛出异常");
		StpUtil.checkRoleAnd("admin", "user");

		System.out.println("角色测试通过");

		return R.ok();
	}

	// 测试权限接口， 浏览器访问： http://localhost:8081/test/testJur
	@GetMapping("testJur")
	public R testJur() {
		System.out.println("======================= 进入方法，测试权限接口 ========================= ");

		System.out.println("是否具有权限101" + StpUtil.hasPermission("101"));
		System.out.println("是否具有权限user-add" + StpUtil.hasPermission("user-add"));
		System.out.println("是否具有权限article-get" + StpUtil.hasPermission("article-get"));

		System.out.println("没有user-add权限就抛出异常");
		StpUtil.checkPermission("user-add");

		System.out.println("在【101、102】中只要拥有一个就不会抛出异常");
		StpUtil.checkPermissionOr("101", "102");

		System.out.println("在【101、102】中必须全部拥有才不会抛出异常");
		StpUtil.checkPermissionAnd("101", "102");

		System.out.println("权限测试通过");

		return R.ok();
	}

	// 测试会话session接口， 浏览器访问： http://localhost:8081/test/session
	@GetMapping("session")
	public R session() throws JsonProcessingException {
		System.out.println("======================= 进入方法，测试会话session接口 ========================= ");
		System.out.println("当前是否登录：" + StpUtil.isLogin());
		System.out.println("当前登录账号session的id" + StpUtil.getSession().getId());
		System.out.println("当前登录账号session的id" + StpUtil.getSession().getId());
		System.out.println("测试取值name：" + StpUtil.getSession().get("name"));
		StpUtil.getSession().set("name", new Date());	// 写入一个值
		System.out.println("测试取值name：" + StpUtil.getSession().get("name"));
		System.out.println( new ObjectMapper().writeValueAsString(StpUtil.getSession()));

		return R.ok();
	}

	// 测试自定义session接口， 浏览器访问： http://localhost:8081/test/session2
	@GetMapping("session2")
	public R session2() {
		System.out.println("======================= 进入方法，测试自定义session接口 ========================= ");
		// 自定义session就是无需登录也可以使用 的session ：比如拿用户的手机号当做 key， 来获取 session
		System.out.println("自定义 session的id为：" + SaSessionCustomUtil.getSessionById("1895544896").getId());
		System.out.println("测试取值name：" + SaSessionCustomUtil.getSessionById("1895544896").get("name"));
		SaSessionCustomUtil.getSessionById("1895544896").set("name", "张三");	// 写入值
		System.out.println("测试取值name：" + SaSessionCustomUtil.getSessionById("1895544896").get("name"));
		System.out.println("测试取值name：" + SaSessionCustomUtil.getSessionById("1895544896").get("name"));

		return R.ok();
	}

	// ----------
	// 测试token专属session， 浏览器访问： http://localhost:8081/test/getTokenSession
	@GetMapping("getTokenSession")
	public R getTokenSession() {
		System.out.println("======================= 进入方法，测试会话session接口 ========================= ");
		System.out.println("当前是否登录：" + StpUtil.isLogin());
		System.out.println("当前token专属session: " + StpUtil.getTokenSession().getId());

		System.out.println("测试取值name：" + StpUtil.getTokenSession().get("name"));
		StpUtil.getTokenSession().set("name", "张三");	// 写入一个值
		System.out.println("测试取值name：" + StpUtil.getTokenSession().get("name"));

		return R.ok();
	}

	// 打印当前token信息， 浏览器访问： http://localhost:8081/test/tokenInfo
	@GetMapping("tokenInfo")
	public R tokenInfo() {
		System.out.println("======================= 进入方法，打印当前token信息 ========================= ");
		SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
		System.out.println(tokenInfo);
		return R.ok();
	}



	// [活动时间] 续签： http://localhost:8081/test/rene
	@GetMapping("rene")
	public R rene() {
		StpUtil.checkActivityTimeout();
		StpUtil.updateLastActivityToNow();

		return R.ok();

	}

	// 测试踢人下线   浏览器访问： http://localhost:8081/test/kickOut
	@GetMapping("kickOut")
	public R kickOut() {
		// 先登录上
		StpUtil.login(10001);
		// 踢下线
		StpUtil.kickout(10001);
		// 再尝试获取
		StpUtil.getLoginId();
		// 返回
		return R.ok();
	}


}

